package com.luxsoft.sw3.cfd;

import java.math.BigDecimal;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Map;

import mx.gob.sat.cfd.x2.TUbicacion;
import mx.gob.sat.cfd.x2.ComprobanteDocument.Comprobante;
import mx.gob.sat.cfd.x2.ComprobanteDocument.Comprobante.Emisor;

import org.apache.commons.lang.StringUtils;
import org.springframework.util.Assert;

import com.luxsoft.siipap.cxc.model.NotaDeCredito;
import com.luxsoft.siipap.cxc.model.OrigenDeOperacion;
import com.luxsoft.siipap.cxc.old.ImporteALetra;
import com.luxsoft.siipap.model.CantidadMonetaria;
import com.luxsoft.siipap.service.ServiceLocator2;
import com.luxsoft.siipap.util.MonedasUtils;
import com.luxsoft.siipap.ventas.model.Venta;
import com.luxsoft.sw3.cfd.model.ComprobanteFiscal;

public class CFDParametrosUtils
{

    public CFDParametrosUtils()
    {
    }

    public static Map resolverParametros(Venta venta, ComprobanteFiscal cf, String cadenaOriginal)
    {
        Assert.notNull(cf, "El comprobante fiscal no puede ser nulo");
        Assert.isTrue(StringUtils.isNotBlank(cadenaOriginal), "Falta la cadena original");
        cf.loadComprobante();
        mx.gob.sat.cfd.x2.ComprobanteDocument.Comprobante comprobante = cf.getComprobante();
        Map parametros = new HashMap();
        parametros.put("FOLIO", (new StringBuilder(String.valueOf(comprobante.getSerie()))).append("-").append(comprobante.getFolio()).toString());
        parametros.put("ANO_APROBACION", Integer.valueOf(comprobante.getAnoAprobacion()));
        parametros.put("NO_APROBACION", Integer.valueOf(comprobante.getNoAprobacion().intValue()));
        parametros.put("NUM_CERTIFICADO", comprobante.getNoCertificado());
        parametros.put("SELLO_DIGITAL", comprobante.getSello());
        parametros.put("CADENA_ORIGINAL", cadenaOriginal);
        parametros.put("NOMBRE", comprobante.getReceptor().getNombre());
        parametros.put("RFC", comprobante.getReceptor().getRfc());
        parametros.put("FECHA", comprobante.getFecha().getTime());
        parametros.put("NFISCAL", (new StringBuilder(String.valueOf(comprobante.getSerie()))).append(" - ").append(comprobante.getFolio()).toString());
        parametros.put("IMPORTE", comprobante.getSubTotal());
        parametros.put("IMPUESTO", comprobante.getImpuestos().getTotalImpuestosTrasladados());
        parametros.put("TOTAL", comprobante.getTotal());
        parametros.put("DIRECCION", CFDUtils.getDireccionEnFormatoEstandar(comprobante.getReceptor().getDomicilio()));
        parametros.put("CARGO_ID", venta.getId());
        parametros.put("IMP_CON_LETRA", ImporteALetra.aLetra(venta.getTotalCM()));
        parametros.put("SUCURSAL", venta.getSucursal().getId());
        parametros.put("CLAVCTE", venta.getClave());
        parametros.put("SUC", Integer.valueOf(venta.getSucursal().getClave()));
        parametros.put("TEL", venta.getCliente().getTelefonosRow());
        parametros.put("D_REV", Integer.valueOf(venta.getDiaRevision()));
        parametros.put("D_PAG", Integer.valueOf(venta.getDiaDelPago()));
        parametros.put("COB", venta.getCobrador() == null ? null : ((Object) (venta.getCobrador().getId())));
        parametros.put("VEND", venta.getVendedor() == null ? null : ((Object) (venta.getVendedor().getId())));
        parametros.put("PLAZO", Integer.valueOf(venta.getPlazo()));
        parametros.put("FREV", venta.isRevision() ? "R" : "");
        parametros.put("SOCIO", venta.getSocio() == null ? null : ((Object) (venta.getSocio().getNombre())));
        parametros.put("TIPO", venta.getOrigen().equals(OrigenDeOperacion.CRE) ? "CREDITO" : "CONTADO");
        parametros.put("DOCTO", venta.getDocumento());
        parametros.put("TAR_COM_IMP", venta.getCargos());
        parametros.put("COMENTARIO", venta.getComentario());
        parametros.put("PCE", venta.isContraEntrega() ? "COD" : "PAGADO CON");
        parametros.put("ENVIO", venta.getPedidoFormaDeEntrega().equals("LOCAL") ? "PASAN" : "ENVIO");
        parametros.put("PEDIDO", venta.getPedidoFolio());
        parametros.put("IP", venta.getPedidoCreatedIp());
        parametros.put("ELAB_VTA", venta.getPedidoCreateUser());
        parametros.put("PUESTO", venta.getPuesto().booleanValue() ? "**PUESTO**" : "");
        parametros.put("DIR_ENTREGA", venta.getMisma().booleanValue() ? "***MISMA***" : ((Object) (venta.getInstruccionDeEntrega())));
        if(venta.getSocio() != null && venta.getMisma().booleanValue())
            parametros.put("DIR_ENTREGA", venta.getSocio().getDireccion());
        parametros.put("KILOS", venta.getKilos());
        if(venta.getSocio() != null)
            parametros.put("DIR_ENTREGA", venta.getSocio().getDireccion());
        parametros.put("IMP_DESC", venta.getSubTotal2());
        parametros.put("CORTES", venta.getImporteCortes());
        parametros.put("FLETE", venta.getFlete());
        parametros.put("CARGOS", venta.getCargos());
        parametros.put("FPAGO", venta.getFormaDePago().name());
        parametros.put("ELAB_FAC", venta.getLog().getCreateUser());
        parametros.put("SURTIDOR", venta.getSurtidor());
        parametros.put("IMPORTE_BRUTO", venta.getImporteBruto());
        parametros.put("SUBTOTAL_2", venta.getImporteBruto().subtract(venta.getImporteDescuento()));
        parametros.put("DESCUENTO", BigDecimal.valueOf(venta.getDescuentoGlobal()));
        parametros.put("DESCUENTOS", venta.getImporteDescuento());
        parametros.put("PINT_IVA", MonedasUtils.IVA.multiply(BigDecimal.valueOf(100L)));
        parametros.put("TIPOX", venta.getOrigen().equals(OrigenDeOperacion.CRE) ? "CREDITO" : "CONTADO");
        if(venta.getClave().equals("1"))
        {
            CantidadMonetaria factor = CantidadMonetaria.pesos(1.0D).add(CantidadMonetaria.pesos(MonedasUtils.IVA));
            parametros.put("IMPORTE_BRUTO", factor.multiply(venta.getImporteBruto()).amount());
            parametros.put("DESCUENTOS", factor.multiply(venta.getImporteDescuento()).amount());
            parametros.put("SUBTOTAL_2", factor.multiply(venta.getImporteBruto().subtract(venta.getImporteDescuento())).amount());
            parametros.put("IMP_DESC", factor.multiply(venta.getSubTotal2()).amount());
            parametros.put("CORTES", factor.multiply(venta.getImporteCortes()).amount());
            parametros.put("FLETE", factor.multiply(venta.getFlete()).amount());
            parametros.put("CARGOS", factor.multiply(venta.getCargos()).amount());
            parametros.put("IMPORTE", comprobante.getTotal());
        }
        return parametros;
    }

    public static Map resolverParametros(NotaDeCredito nota, ComprobanteFiscal cf, String cadenaOriginal)
    {
        Assert.notNull(cf, "ComprobanteFiscal no puede ser nulo");
        Assert.isTrue(StringUtils.isNotBlank(cadenaOriginal), "Falta la cadena original");
        cf.loadComprobante();
        mx.gob.sat.cfd.x2.ComprobanteDocument.Comprobante comprobante = cf.getComprobante();
        Map parametros = new HashMap();
        parametros.put("FOLIO", (new StringBuilder(String.valueOf(comprobante.getSerie()))).append("-").append(comprobante.getFolio()).toString());
        parametros.put("ANO_APROBACION", Integer.valueOf(comprobante.getAnoAprobacion()));
        parametros.put("NO_APROBACION", Integer.valueOf(comprobante.getNoAprobacion().intValue()));
        parametros.put("NUM_CERTIFICADO", comprobante.getNoCertificado());
        parametros.put("SELLO_DIGITAL", comprobante.getSello());
        parametros.put("CADENA_ORIGINAL", cadenaOriginal);
        parametros.put("NOMBRE", comprobante.getReceptor().getNombre());
        parametros.put("RFC", comprobante.getReceptor().getRfc());
        parametros.put("FECHA", comprobante.getFecha().getTime());
        parametros.put("NFISCAL", (new StringBuilder(String.valueOf(comprobante.getSerie()))).append(" - ").append(comprobante.getFolio()).toString());
        parametros.put("IMPORTE", comprobante.getSubTotal());
        parametros.put("IMPUESTO", comprobante.getImpuestos().getTotalImpuestosTrasladados());
        parametros.put("TOTAL", comprobante.getTotal());
        parametros.put("DIRECCION", CFDUtils.getDireccionEnFormatoEstandar(comprobante.getReceptor().getDomicilio()));
        return parametros;
    }

    public static Venta buscarVenta(String ventaId)
    {
        return ServiceLocator2.getVentasManager().buscarVentaInicializada(ventaId);
    }
}
